package com.sfx.other.JVM.ClassLoader.reflection;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: sfx
 * Date: 2023-09-10
 * Time: 16:48
 */
enum size {

}

public class TestDemo1 {


     int filed1 = 0;
    private static int filed2 = 9;


    public int filed4 = 4444;
    public static int filed6 = 33333;


    private void method1() {

    }

    protected void method2(int x) {

    }

    public void method3(int x, int y) {

    }

    public int method4(int x, int y) {
        return x + y;
    }

    int method5(int x, int y, int z) {
        return x + y + z;
    }

    public static int method6(int x, int y, int z) {
        return x + y + z;
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        // 通过类名.class得到class对象
//        Class<Date> dateClass = Date.class;
//        Date date = new Date();
//        Class<? extends Date> aClass = date.getClass();
//        // 接口的class对象
//        Class<Comparable> comparableClass = Comparable.class;
//        // 基本数据类型不能使用getClass(),但是也有对应的class对象,类型参数是他们的包装类型
//        Class<Integer> integerClass = int.class;
//        Class<Character> characterClass = char.class;
//        Class<Double> doubleClass = double.class;
//        Class<Float> floatClass = float.class;
//        // 枚举也有对应的class对象
//        Class<size> sizeClass = size.class;

        // 我们可以通过Class.forName(""),通过类名直接加载Class类,获取Class对象
        Class<?> aClass1 =
                Class.forName("com.sfx.other.JVM.ClassLoader.reflection.TestDemo1");

        //        // 有了class对象,我们就可以获取关于类型的很多信息
//        // 包括 名称信息,字段信息,方法信息,创建对象和构造方法,类型信息等.
////
////        // 返回的名称不带包名信息
////        System.out.println(aClass1.getSimpleName());
////        // Java内部使用的真正的名称
////        System.out.println(aClass1.getName());
////        // 返回的名称更加友好
////        System.out.println(aClass1.getCanonicalName());
//
//
//        // 返回所有的public字段,
////        Field[] fields = aClass1.getFields();
////        for (Field f : fields) {
////            System.out.println(f.getName() + " " + f.isAccessible());
////        }
////        Field[] fields = aClass1.getDeclaredFields();
////        for (Field f : fields) {
////            System.out.println(f.getName() + " " + f.isAccessible());
////        }
//        Field field = aClass1.getDeclaredField("filed2");
//        System.out.println(field);

        List<String> obj = Arrays.asList(new String[]{"老妈", "编程"});
        Class<? extends List> aClass = obj.getClass();
        for (Field f : aClass.getDeclaredFields()) {
            f.setAccessible(true);
            System.out.println(f);
            System.out.println(f.getName() + " - " + f.get(obj));
        }

    }
}